﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Model.Clientes;
using Model.Contratos;
using Model.Tipologias;

namespace welwitschia.Clientes
{
    public partial class UnidadeDetalhe : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {

                Cliente cliente = null;
                Unidade unidade = null;
                Unidade unidadePai = null;
                IClienteService clienteService = new ClienteService();

                txtIdUnidade.Enabled = false;

                if (!String.IsNullOrEmpty(Request.QueryString["cid"]))
                {
                    Int64 idCliente = Convert.ToInt64(Request.QueryString["cid"]);
                    cliente = clienteService.ObterPorIdCliente(idCliente);
                    btnNovaUnidadeFilho.Enabled = false;
                }
                
                if (!String.IsNullOrEmpty(Request.QueryString["uid"]))
                {
                    Int64 idUnidade = Convert.ToInt64(Request.QueryString["uid"]);
                    unidade = clienteService.ObterUnidadePorIdUnidade(idUnidade);
                    cliente = unidade.Cliente;

                    txtIdUnidade.Text = unidade.IdUnidade.ToString();
                    txtDesignacao.Text = unidade.Designacao;
                    chkComServico.Checked = unidade.Servico;
                }

                if (!String.IsNullOrEmpty(Request.QueryString["uidp"]))
                {
                    Int64 idUnidade = Convert.ToInt64(Request.QueryString["uidp"]);
                    unidadePai = clienteService.ObterUnidadePorIdUnidade(idUnidade);
                    cliente = unidadePai.Cliente;
                    btnNovaUnidadeFilho.Enabled = false;
                }

                ddlUnidadesPai.DataTextField = "Designacao";
                ddlUnidadesPai.DataValueField = "IdUnidade";

                txtIdCliente.Text = cliente.IdCliente.ToString();
                txtNomeCliente.Text = cliente.Nome;

                ddlUnidadesPai.DataSource = clienteService.ObterUnidadesPorCliente(cliente);
                ddlUnidadesPai.DataBind();

                if (unidade != null )
                {
                    lvUnidades.DataSource = clienteService.ObterUnidadesFilhoPorUnidadePai(unidade);
                    lvUnidades.DataBind();
                    if(unidade.UnidadePai != null)
                        ddlUnidadesPai.SelectedValue = unidade.UnidadePai.IdUnidade.ToString();
                   
                    IContratoService contratoService = new ContratoService();
                    IList<UnidadeRefeicaoContrato> lUnidadeRefeicaoContrato =
                        contratoService.ObterUnidadeRefeicaoContratoPorUnidade(unidade.IdUnidade);

                    CarregalvRefeicoes(lUnidadeRefeicaoContrato);
                }

                if (unidadePai != null)
                {
                    ddlUnidadesPai.SelectedValue = unidadePai.IdUnidade.ToString();
                    BindTreeViewFamilias(cliente.IdCliente, unidadePai.IdUnidade);
                }
                else
                {
                    BindTreeViewFamilias(cliente.IdCliente, null);
                }

                
                ddlUnidadesPai.Items.Insert(0, new ListItem() { Text = "", Value = "-1000" });

            }
        }

        protected void btnGravar_Click(object sender, EventArgs e)
        {
            IClienteService clientesService = new ClienteService();
            Unidade unidade = new Unidade();
            unidade.Designacao = txtDesignacao.Text.Trim();
            unidade.Servico = chkComServico.Checked;
            unidade.Cliente = new Cliente() { IdCliente = Convert.ToInt64(txtIdCliente.Text) };
            if(ddlUnidadesPai.SelectedIndex > 0)
                unidade.UnidadePai = new Unidade() { IdUnidade = Convert.ToInt64(ddlUnidadesPai.SelectedValue.Trim()) };
            
            if (String.IsNullOrEmpty(txtIdUnidade.Text.Trim()))
            {
                unidade = clientesService.Insere(unidade);
                txtIdUnidade.Text = unidade.IdUnidade.ToString();
                
                InicializaListaRefeicoesUnidade(unidade);
                
                btnNovaUnidadeFilho.Enabled = true;
            }
            else
            {
                unidade.IdUnidade = Convert.ToInt64(txtIdUnidade.Text);
                clientesService.Actualiza(unidade);
                ActualizaListaRefeicoesUnidade(unidade);
            }
        }

        protected void btnNovaUnidadeFilho_Click(object sender, EventArgs e)
        {
            Response.Redirect(@"~\Clientes\UnidadeDetalhe.aspx?uidp=" + txtIdUnidade.Text);
            
        }

        protected void btnVoltar_Click(object sender, EventArgs e)
        {

        }


        private Dictionary<Int64, TreeNode> _idxTreeView = new Dictionary<Int64, TreeNode>();


        private void BindTreeViewFamilias(Int64 idCliente, Int64? idUnidade)
        {
            tvUnidades.Nodes.Clear();

            IClienteService clienteService = new ClienteService();
            IList<Unidade> unidades = clienteService.ObterUnidadesPorCliente(idCliente);

            IEnumerable<Unidade> found = unidades.Where<Unidade>(e => e.UnidadePai == null);
            foreach (Unidade u in found)
            {
                AddNode(u, idUnidade);
            }

            found = unidades.Where<Unidade>(e => e.UnidadePai != null);
            foreach (Unidade u in found)
            {
                AddNode(u, idUnidade);
            }
        }

        private void AddNode(Unidade unidade, Int64? idUnidade)
        {
            TreeNode node = new TreeNode();
            node.Text = unidade.Designacao;
            node.Value = unidade.IdUnidade.ToString();
            if (idUnidade.HasValue)
            {
                if (idUnidade.Value == unidade.IdUnidade)
                    node.Select();
            }
            _idxTreeView.Add(unidade.IdUnidade, node);

            if (unidade.UnidadePai != null)
            {
                TreeNode nodePai = _idxTreeView[unidade.UnidadePai.IdUnidade];
                nodePai.ChildNodes.Add(node);
            }
            else
            {
                tvUnidades.Nodes.Add(node);
            }
        }

        protected void tvUnidades_SelectedNodeChanged(object sender, EventArgs e)
        {
            ddlUnidadesPai.SelectedValue = tvUnidades.SelectedValue;
        }

        #region Eventos ListView lvUnidades

        protected void lvUnidades_ItemDeleting(object sender, ListViewDeleteEventArgs e)
        {
            IClienteService clientesService = new ClienteService();
            clientesService.Apaga(new Unidade() { IdUnidade = Convert.ToInt64(e.Keys["IdUnidade"]) });
        }

        protected void lvUnidades_ItemEditing(object sender, ListViewEditEventArgs e)
        {
        }

        protected void lvUnidades_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "Edit")
                Response.Redirect(@"~\Clientes\UnidadeDetalhe.aspx?uid=" + e.CommandArgument.ToString());
        }

        #endregion


        #region Eventos ListView lvRefeicoes

        protected void lvRefeicoes_ItemDeleting(object sender, ListViewDeleteEventArgs e)
        {
        }

        protected void lvRefeicoes_ItemEditing(object sender, ListViewEditEventArgs e)
        {
        }

        protected void lvRefeicoes_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
        }

        protected void lvRefeicoes_ItemCreated(object sender, ListViewItemEventArgs e)
        {
            if (e.Item.ItemType == ListViewItemType.DataItem)
            {

                if (e.Item.DataItem != null)
                {
                    IContratoService contratoService = new ContratoService();

                    IList<PrecoRefeicaoContrato> lPreco = contratoService.ObterTodosPrecoPorRefeicaoContratada(
                                                ((UnidadeRefeicaoContrato)e.Item.DataItem).RefeicaoContrato.IdRefeicaoContratada);
                    DropDownList ddl = (DropDownList)e.Item.FindControl("ddlTipoServico");

                    if (ddl != null)
                    {
                        ddl.DataSource = from a in lPreco
                                         select new { Descricao = a.TipoServico.Descricao, Codigo = a.TipoServico.Codigo };

                        ddl.DataTextField = "Descricao";
                        ddl.DataValueField = "Codigo";
                        ddl.DataBind();

                    }
                }
            }


        }

        protected void lvRefeicoes_ItemDataBound(object sender, ListViewItemEventArgs e)
        {
            DropDownList ddl = (DropDownList)e.Item.FindControl("ddlTipoServico");
            HiddenField hf = (HiddenField)e.Item.FindControl("hfCodTipoServico");
            ddl.Items.Insert(0, new ListItem() { Text = "", Value = "-1000" });
            ddl.SelectedValue = hf.Value;

        }

        protected void lvRefeicoes_DataBinding(object sender, EventArgs e)
        {

        }
        #endregion


        #region Métodos de suporte

        private void InicializaListaRefeicoesUnidade(Unidade unidade)
        {
            IContratoService contratoService = new ContratoService();
            //Associa as várias refeicões do contrato à unidade criada
            IList<UnidadeRefeicaoContrato> lUnidadeRefeicaoContrato =
                contratoService.ObterUnidadeRefeicaoContratoPorUnidade(unidade.IdUnidade);
            foreach (UnidadeRefeicaoContrato urc in lUnidadeRefeicaoContrato)
            {
                urc.Activa = true;
                contratoService.Actualiza(urc);
            }

            CarregalvRefeicoes(lUnidadeRefeicaoContrato);

        }


        private void ActualizaListaRefeicoesUnidade(Unidade unidade)
        {
            UnidadeRefeicaoContrato urc = null;

            for (Int32 i = 0; i < lvRefeicoes.Items.Count; i++)
            {
                IContratoService contratoService = new ContratoService();
                urc = new UnidadeRefeicaoContrato();
                //urc.ClasseRefeicao = refeicaoContrato.TipoClasseRefeicao;
                //urc.RefeicaoContrato = refeicaoContrato;
                //urc.TipoRefeicao = refeicaoContrato.TipoRefeicao;
                urc.Unidade = unidade;

                CheckBox chkActiva = (CheckBox)lvRefeicoes.Items[i].Controls[1].Controls[2].FindControl("chkServicoActivo");
                DropDownList ddlServico = (DropDownList)lvRefeicoes.Items[i].Controls[1].Controls[2].FindControl("ddlTipoServico");
                HiddenField hfActivaEstadoOriginal = (HiddenField)lvRefeicoes.Items[i].Controls[1].Controls[2].FindControl("hfActivaEstadoOriginal");
                HiddenField hfIdRefeicaoContratada = (HiddenField)lvRefeicoes.Items[i].Controls[1].Controls[2].FindControl("hfIdRefeicaoContratada");

                urc.RefeicaoContrato = new RefeicaoContrato() { IdRefeicaoContratada = Convert.ToInt64(hfIdRefeicaoContratada.Value) };

                if (chkActiva.Checked)
                {
                    if (ddlServico.SelectedIndex == 0)
                    {
                        throw new Exception("Deve indicar o tipo de serviço para todas as refeições servidas por esta unidade.");
                    }
                    else
                    {
                        urc.TipoServico = new Tipologia() { Codigo = ddlServico.SelectedValue };

                        if (Convert.ToBoolean(hfActivaEstadoOriginal.Value))
                            contratoService.Actualiza(urc);
                        else
                            contratoService.Insere(urc);
                    }
                }
                else
                {
                    if (Convert.ToBoolean(hfActivaEstadoOriginal.Value))
                        contratoService.Apaga(urc);
                }
            }
        }


        private void CarregalvRefeicoes(IList<UnidadeRefeicaoContrato> lUnidadeRefeicaoContrato)
        {
            lvRefeicoes.DataSource = lUnidadeRefeicaoContrato;
            lvRefeicoes.DataBind();
        }

       
        #endregion

       

       
     
    }
}